#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<sys/types.h>
#include<sys/wait.h>
#define MAX 1024
#define ARGC 64
#define  SEP  " "
int split(char*commandstr,char *argv[])
{
  assert(commandstr);
  assert(argv);
  argv[0]=strtok(commandstr,SEP);
  if(argv[0]==NULL) return  -1;
//  int i=1;
//  while(1)
//  {
//    argv[i]=strtok(NULL,SEP);
//    if(argv[i]==NULL)break;
//    i++;
//  }
  return 0;
}
void debugPrint(char*argv[])
{
  int i=0;
  for(i=0;argv[i];i++)
  {
    printf("%d:%s\n",i,argv[i]);
  }
}
int main()
{
  extern char**environ;
  while(1)
  {
    char commandstr[MAX]={0};
     char *argv[ARGC]={NULL};
    printf("[xiaolu@mymachine currpath]#");
    fflush(stdout);
    char *s=fgets(commandstr,sizeof(commandstr),stdin);
    assert(s);
    (void) s;//保证在release版本发布的时候，因为去掉了assert了，所以s就没有被使用，而带来的编译警告，什么都没有做，但是充当因此使用
    commandstr[strlen(commandstr)-1]='\0';
    int n=split(commandstr,argv);
   if(n!=0)continue;
//    debugPrint(argv);
    if(strcmp(argv[0],"cd")==0)
    {
      if(argv[1]!=NULL) chdir(argv[1]);
      continue;
    }
    else if(strcmp(argv[0],"export")==0)
    {
      if(argv[1]!=NULL) putenv(argv[1]);
     continue;
    }
     if(strcmp(argv[0],"ls")==0)
     {
       int pos=0;
       while(argv[pos])pos++;
       argv[pos++]=(char*)"--color=auto";
       argv[pos]=NULL;
     }
    pid_t id=fork();
    assert(id>=0);
    (void) id;
    if(id==0)
    {
      //child
      execvpe(argv[0],argv,environ);
      exit(1);
    }
    int status=0;
    waitpid(id,&status,0);
    //  printf("%s\n",commandstr);
   // sleep(1);
  }
}
